package main

import (
	"fmt"
	"reflect"
)

func main() {
	fmt.Println("3. 数据类型")

	// 布尔类型
	var isGo bool = true
	fmt.Printf("布尔类型: isGo=%t, 类型=%T\n", isGo, isGo)

	// 数字类型
	// 整数类型
	var i int = 42
	var i8 int8 = 127
	var i16 int16 = 32767
	var i32 int32 = 2147483647
	var i64 int64 = 9223372036854775807

	fmt.Printf("整数类型: i=%d(%T), i8=%d(%T), i16=%d(%T), i32=%d(%T), i64=%d(%T)\n",
		i, i, i8, i8, i16, i16, i32, i32, i64, i64)

	// 无符号整数类型
	var u uint = 42
	var u8 uint8 = 255
	var u16 uint16 = 65535
	var u32 uint32 = 4294967295
	var u64 uint64 = 18446744073709551615

	fmt.Printf("无符号整数类型: u=%d(%T), u8=%d(%T), u16=%d(%T), u32=%d(%T), u64=%d(%T)\n",
		u, u, u8, u8, u16, u16, u32, u32, u64, u64)

	// 浮点类型
	var f32 float32 = 3.14159
	var f64 float64 = 3.141592653589793
	fmt.Printf("浮点类型: f32=%f(%T), f64=%f(%T)\n", f32, f32, f64, f64)

	// 复数类型
	var c64 complex64 = 3 + 4i
	var c128 complex128 = complex(5, 12)
	fmt.Printf("复数类型: c64=%v(%T), c128=%v(%T)\n", c64, c64, c128, c128)

	// 字符串类型
	var str string = "Hello, Go!"
	fmt.Printf("字符串类型: str=%s(%T)\n", str, str)

	// 字符类型 (rune)
	var ch rune = 'G'
	fmt.Printf("字符类型: ch=%c(%T)\n", ch, ch)

	// 字节类型
	var b byte = 'A'
	fmt.Printf("字节类型: b=%c(%T)\n", b, b)

	// 数组类型
	var arr [3]int = [3]int{1, 2, 3}
	fmt.Printf("数组类型: arr=%v(%T)\n", arr, arr)

	// 切片类型
	var slice []int = []int{1, 2, 3, 4, 5}
	fmt.Printf("切片类型: slice=%v(%T)\n", slice, slice)

	// 映射类型
	var m map[string]int = map[string]int{"one": 1, "two": 2}
	fmt.Printf("映射类型: m=%v(%T)\n", m, m)

	// 指针类型
	var ptr *int = &i
	fmt.Printf("指针类型: ptr=%v(%T)\n", ptr, ptr)
	fmt.Printf("指针指向的值: *ptr=%d\n", *ptr)

	// 结构体类型
	type Person struct {
		Name string
		Age  int
	}
	var p Person = Person{Name: "张三", Age: 30}
	fmt.Printf("结构体类型: p=%v(%T)\n", p, p)

	// 接口类型
	var iface interface{} = "这是一个接口变量"
	fmt.Printf("接口类型: iface=%v(%T)\n", iface, iface)

	// 反射查看类型
	fmt.Printf("使用反射查看类型: %v\n", reflect.TypeOf(str))
}
